package com.jie.server.mvc.generate;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

/**
 * 代码生成器
 * @author XieZhiJie
 * @date 2022/04/24 18:17
 */
public class CodeGenerate {

    public static void main(String[] args) {
        String url = "jdbc:mysql://127.0.0.1:3306/chat?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";
        String username = "sb";
        String password = "123456";
        String[] tables = {"user", "apply_friend", "friend", "group", "group_relevance", "single_chat", "group_chat"};
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {
                    // 设置作者
                    builder.author("XieZhiJie")
                            // 开启 swagger 模式
                            // .enableSwagger()
                            // 设置注释日期的格式
                            .commentDate("yyyy-MM-dd")
                            // 覆盖已生成文件
                            .fileOverride()
                            // 指定输出目录
                            // E:\code\java_code\graduation_project\20220421\graduation_project\server\src\main\java
                            .outputDir("E:\\code\\java_code\\graduation_project\\20220421\\graduation_project\\server\\src\\main\\java");
                })
                .packageConfig(builder -> {
                    // 设置父包名
                    builder.parent("com.jie.server.mvc")
                            // 设置父包模块名
                            // .moduleName("")
                            // 设置实体类生成位置
                            .entity("model.entity")
                            .mapper("mapper")
                            .service("service")
                            .serviceImpl("service.impl")
                            .controller("controller")
                            // 设置mapperXml生成路径 E:\code\java_code\graduation_project\20220421\graduation_project\server\src\main\resources\mapper
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "E:\\code\\java_code\\graduation_project\\20220421\\graduation_project\\server\\src\\main\\resources\\mapper\\"));
                })
                // 设置需要生成的表名
                .strategyConfig(builder -> builder.addInclude(tables)
                        // 设置过滤表前缀, 在生成实体类时会将过滤的表前缀去掉
                        //.addTablePrefix("t_")

                        // 进入实体类生成配置
                        .entityBuilder()
                        // 开启lombok, 默认false
                        .enableLombok()
                        // 设置将表中字段的is前缀删除
                        // .enableRemoveIsPrefix()
                        // 开启生成实体时生成字段注解
                        .enableTableFieldAnnotation()
                        // 设置生成实体类的文件名后缀
                        // .formatFileName("%sDo")
                        // 数据库表映射到实体的命名策略: 驼峰命名法
                        .naming(NamingStrategy.underline_to_camel)
                        // 数据库表字段映射到实体的命名策略
                        .columnNaming(NamingStrategy.underline_to_camel)
                        // 全局主键类型, 自增主键
                        .idType(IdType.AUTO)
                        .build()

                        // 进入controller类生成配置
                        .controllerBuilder()
                        // 开启@RestController
                        .enableRestStyle()
                        // 开启驼峰转连字符
                        .enableHyphenStyle()

                        // 进入service层生成配置
                        .serviceBuilder()
                        // 设置生成服务层的文件名后缀, 不设置的话服务层首字母会添加一个I
                        .formatServiceFileName("%sService")
                        .formatServiceImplFileName("%sServiceImpl")
                        .superServiceClass(IService.class)
                        .superServiceImplClass(ServiceImpl.class)

                        // 进入mapper层
                        .mapperBuilder()
                        .superClass(BaseMapper.class)
                        // 开启@Mapper注解
                        .enableMapperAnnotation()
                        .formatMapperFileName("%sMapper")
                        .formatXmlFileName("%sMapper")

                        .build())
                // 使用Freemarker引擎模板, 默认的是Velocity引擎模板
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }

}
